package com.xc.file.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xc.core.bean.QueryBean;
import com.xc.file.bean.CdnBean;
import com.xc.file.bean.FileBean;
import com.xc.file.bean.UpdateFileBean;
import com.xc.file.dto.CdnDto;
import com.xc.file.dto.FileDto;
import com.xc.file.entity.FileEntity;
import com.xc.file.model.DownloadModel;

import java.util.List;
import java.util.function.Consumer;

/**
 * <p>文件管理接口</p>
 *
 * @author xc
 * @version v1.0.0
 */
public interface FileService extends IService<FileEntity> {

    /**
     * <p>创建文件</p>
     *
     * @param userId   用户id
     * @param fileBean 文件信息
     * @return 创建成功的文件信息
     */
    public FileDto createFile(String userId, FileBean fileBean, boolean isVerify);


    /**
     * <p>修改用户的文件名称</p>
     *
     * @param userId         用户id
     * @param fileId         文件id
     * @param updateFileBean 文件信息
     * @return 返回结果
     */
    public FileDto updateUserFile(String userId, String fileId, UpdateFileBean updateFileBean);

    /**
     * <p>获取用户的文件集合</p>
     *
     * @param userId    用户id
     * @param queryBean 查询基础条件
     * @param fileBean  文件条件
     * @return 文件信息集合
     */
    public List<FileDto> getUserFileList(String userId, QueryBean queryBean, FileBean fileBean);


    /**
     * <p>删除用户的文件</p>
     *
     * @param userId 用户id
     * @param fileId 文件id
     */
    public FileEntity deleteUserFile(String userId, String fileId);

    /**
     * <p>修改用户的文件集合</p>
     * <p>批量移动文件</p>
     *
     * @param userId   用户id
     * @param folderId 目录id
     * @param ids      需要移动的文件id集合
     * @return 移动后的文件集合信息
     */
    public List<FileDto> updateUserFileList(String userId, String folderId, List<String> ids);

    /************************************以上接口方法***************************************/

    /**
     * <p>根据文件夹id查询文件集合</p>
     *
     * @param folderId 文件夹id
     * @return 文件集合
     */
    public List<FileEntity> getFilesByFolderId(String folderId);

    /**
     * <p>写入下载文件地址</p>
     *
     * @param files        文件信息集合
     * @param downloadPath 下载地址
     * @return 文件信息集合，带有下载url
     */
    public List<FileDto> setDownloadUrl(List<FileDto> files, String downloadPath);


    /**
     * 批量创建文件
     *
     * @param entities 文件集合
     * @param isRename 是否重命名
     * @return 创建后的文件信息集合
     */
    public List<FileDto> createFiles(List<FileEntity> entities, boolean isRename);

    /**
     * 批量复制文件
     *
     * @param userId   当前用户的id
     * @param folderId 文件的新目录id
     * @param fileIds  文件id集合
     * @param isCopy   是否是拷贝
     * @return 文件集合
     */
    public List<FileDto> batchCopyFile(String userId, String folderId, List<String> fileIds, boolean isCopy);

    /**
     * 验证Cdn文件
     *
     * @param referer 当前请求域
     * @param account 用户账号
     * @param fixed   文件固定地址
     * @return 下载信息
     */
    public DownloadModel verifyCdnFile(String referer, String account, String fixed);

    /**
     * 验证用户文件
     *
     * @param downloadCode 下载code
     * @param fid          文件id
     * @return 下载信息
     */
    public DownloadModel getDownloadModel(String downloadCode, String fid, String downloadType);

    /**
     * 下载完成
     *
     * @param downloadModel 参数
     */
    public void downloadFinish(DownloadModel downloadModel);

    /**
     * 批量删除文件源
     *
     * @param hashCodes 文件hash集合
     * @param batchSize 没次处理多少条
     * @param action    回调
     */
    public void verifyHashCode(List<String> hashCodes, int batchSize, Consumer<List<String>> action);

    /**
     * 创建当前用户的cdn地址
     *
     * @param userId  用户id
     * @param cdnBean cdn信息
     */
    public CdnDto createCdnUrl(String userId, CdnBean cdnBean);

    /**
     * 获取文件集合的大小
     *
     * @param fileIds 文件集合id
     * @param userId  用户id，可为null
     * @return 文件集合大小
     */
    public long getFileSize(List<String> fileIds, String userId);
}
